{\rtf0\ansi{\fonttbl\f0\fmodern Courier;\f1\ftech Symbol;\f2\fmodern Ohlfs;}
\margl40
\margr40
\pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b0\i0\ulnone\fs24\fc0\cf0 //ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//
\i 	
\b FILENAME
\b0 :	
\b\i0 eText.eTDoc.m\

\b0 //
\i 	
\b SUMMARY
\b0 :	
\b\i0 Implementation of interactions between eText and eTDoc
\b0 \
//	
\b\i CATEGORY
\b0 :
\i0 	
\b eTDoc
\b0 \
//	
\b\i PROTOCOLS
\b0 :
\i0 	
\b None
\b0 \
//	
\b\i INTERFACE
\b0 :
\i0 	
\b None
\b0 \
//	
\b\i AUTHOR
\b0 :		
\b\i0 Rohit Khare
\b0 \
//	
\b\i COPYRIGHT
\b0 :	
\f1\i0 с
\f0\b 1993,94 California Institure of Technology, eText Project\

\b0 //ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//	
\b\i Implementation Comments
\b0\i0 \
//		undoManager is little more than a "local cache".\
//		Dragging out an etfLink is only in the margin-- cross-ref this to\
//	code in Pasteboard that checks it when dropping files. This prevents the\
//	click-and-drop scenario.\
//		Dragging out should lazily create the dragged .etfLink file, but...\
//ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//	
\b\i History
\b0\i0 \
//	10/17/94:	
\b Cleaned up for eText5.
\b0 \
//	08/05/94:	
\b Completely Rearchitected for 5.0. RK
\b0 \
//ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//	
\b Imported Interfaces
\b0 \
//\
	#import "
\b eText.eTDoc.h
\b0 "\
\

\i @implementation eText(eTDoc)\

\i0 //ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//	
\b Accessors
\b0 \
//\
\
- 
\b setDoc
\b0 :newDoc \{\
	
\b etDoc
\b0  = 
\b newDoc
\b0 ;\
	
\b undoManager
\b0  = [etDoc 
\b undoManager
\b0 ];\
	[undoManager 
\b addUndoDelegate
\b0 :
\b self
\b0 ];\
	if (
\b !
\b0 [self 
\b textLength
\b0 ]) \{		// 
\i if it's a virgin document, set the font.\

\i0 		id font = [[etDoc 
\b docInfo
\b0 ] 
\b tagFont
\b0 :
\b BODY
\b0 ];\
	    if ([font matrix] != NX_FLIPPEDMATRIX)\
		    font = [Font newFont:[font name] size:[font pointSize]\
						  matrix:NX_FLIPPEDMATRIX];\
		[self 
\b setFont
\b0 :font];\
	\}\
	return self;\
\}\
- 
\b etDoc
\b0 	\{return 
\b etDoc
\b0 ;\}\
- 
\b undoManager
\b0  \{return 
\b undoManager
\b0 ;\}\
- 
\b touch
\b0  \{return [etDoc 
\b touch
\b0 ];\}\
- 
\b touch
\b0 :sender \{return [etDoc 
\b touch
\b0 ];\}\
\
//ппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппппп\
//	
\b Dragging Source (etfLink)
\b0 \
//\
- (
\b NXDragOperation
\b0 )
\b draggingSourceOperationMaskForLocal
\b0 :(
\b BOOL
\b0 )isLocal \{\
	return (
\b isLocal
\b0  ? 
\b NX_DragOperationLink
\b0  : 
\b NX_DragOperationAll
\b0 );\}\
- (
\b BOOL
\b0 )
\b acceptsFirstMouse
\b0  \{\
	return 
\b YES
\b0 ;\}\
- (
\b BOOL
\b0 )
\b shouldDelayWindowOrderingForEvent
\b0 :(
\b NXEvent
\b0  *)e \{\
	NXCoord l,r,t,b;\
	[self 
\b getMarginLeft
\b0 :&l right:&r top:&t bottom:&b]; \
	return ((e->location.x < (
\b l
\b0  + 
\b SCROLLWIDTH
\b0 ))?YES:NO);\
\}\
- 
\b mouseDown
\b0 :(
\b NXEvent
\b0  *)e\
\{\
	NXCoord l,r,t,b;\
	id	
\b theDocInfo
\b0  = [
\b etDoc
\b0  
\b docInfo
\b0 ];\
	\
	[self 
\b getMarginLeft
\b0 :&l right:&r top:&t bottom:&b]; \
	if (
\b theDocInfo
\b0  &&\

\i 		
\i0 (e->location.x < (
\b l
\b0  + 
\b SCROLLWIDTH
\b0 )))\{\
		char 	
\b path
\b0 [MAXPATHLEN];\
		static id 
\b theTable
\b0 =nil;	// 
\i static since it's allocated once and 
\b empty
\b0 d
\i0 \
		NXPoint	
\b org
\b0 ;\
		NXPoint	
\b offset
\b0 ;\
		id		
\b dragPasteboard
\b0 ;\
		NXAtom	theType;\
\
		if (!theTable) 
\b theTable
\b0  = [[
\b NXStringTable
\b0  alloc] 
\b init
\b0 ];\
		[theTable insertKey:
\b DOCID
\b0  value:[
\b theDocInfo
\b0  
\b docIDStr
\b0 ]];\
		[theTable insertKey:
\b ANCHORID
\b0  value:"
\b 0
\b0 "];\
		[theTable insertKey:
\b DOCTITLE
\b0  value:[
\b theDocInfo
\b0  
\b docTitle
\b0 ]];\
		[theTable insertKey:
\b ANCHORTITLE
\b0  value:[
\b theDocInfo
\b0  
\b docTitle
\b0 ]];\
		sprintf(path, "
\b /tmp/%s.
\b0 " 
\b LINK_EXT
\b0 , [
\b theDocInfo
\b0  
\b docTitle
\b0 ]);\
		[theTable 
\b writeToFile
\b0 :
\b path
\b0 ];\
		[theTable 
\b empty
\b0 ];\
		\
		
\b dragPasteboard
\b0  = [Pasteboard newName: 
\b NXDragPboard
\b0 ];\
		[dragPasteboard 
\b declareTypes
\b0 :&
\b NXFileContentsPboardType
\b0  \
						 num:1 owner:nil];\
		[dragPasteboard 
\b writeFileContents
\b0 :
\b path
\b0 ];\
		theType = 
\b NXFilenamePboardType
\b0 ;\
		[dragPasteboard 
\b addTypes
\b0 :&theType num:1 owner:nil];\
		[dragPasteboard 
\b writeType
\b0 :theType 
\b data
\b0 :
\b path
\b0  
\b length
\b0 :
\b strlen
\b0 (path)
\b +1
\b0 ];\
\
		
\b org
\b0  = e->
\b location
\b0 ;\
		[self 
\b convertPoint
\b0 :&
\b org
\b0  
\b fromView
\b0 :
\b nil
\b0 ];\
		org.x -= 5.0; org.y += 5.0;	// 
\i NXLinkButton is 10x10 pixels
\i0 .\
		offset.x = offset.y = 0.0;\
		[self 
\b dragImage
\b0 :[NXImage findImageNamed:"
\b NXLinkButton
\b0 "]\
			
\b at
\b0 :&org 
\b offset
\b0 :&offset\
			
\b event
\b0 :e 
\b pasteboard
\b0 :dragPasteboard\
			
\b source
\b0 :self 
\b slideBack
\b0 : YES];		\
		return 
\b self
\b0 ;\
	\}\
	return [
\b super
\b0  
\b mouseDown
\b0 :e];\
\}\
@end
}
